/**
 * 
 */
package com.trueque.uniandes.server;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;

import com.trueque.uniandes.shared.DatosProductos;

/**
 * @author Gabrie
 *
 */
public class DaoCliente {

	private static final String URL= "jdbc:oracle:thin:@chie.uniandes.edu.co:1521:chie10";
	private static final String USUARIO= "s2304a22";
	private static final String CLAVE= "angelica";
	private static final String DRIVER= "oracle.jdbc.driver.OracleDriver";
	/**
	 * conexion con la base de datos
	 */
	public Connection conexion;

	public DaoCliente(){
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try
		{
			conexion = DriverManager.getConnection(URL,USUARIO,CLAVE);
		}
		catch( SQLException exception )
		{
			exception.printStackTrace();
		}
	}

	public String autenticarUsuario(String username, String password) {
		String email="";
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs = stmt.executeQuery("SELECT C.EMAIL AS EMAIL FROM CLIENTES C WHERE C.USUARIO='"+username+"' AND C.PASSWORD='"+password+"'");
			while ( rs.next() ) {
				email=rs.getString("EMAIL"); 
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return email;
	}

	public ArrayList<DatosProductos> darProductos(String email) {
		System.out.println(System.currentTimeMillis());
		ArrayList<DatosProductos> array= new ArrayList<DatosProductos>();
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs = stmt.executeQuery("SELECT P.ID,P.NOMBRE,P.VALOR_ESTIMADO FROM PRODUCTOS P WHERE P.EMAIL_CLIENTE='"+email+"'");
			while ( rs.next() ) {
				array.add(new DatosProductos(rs.getString("ID"), rs.getString("NOMBRE"), rs.getString("VALOR_ESTIMADO"),null,null,null,null)); 
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println(System.currentTimeMillis());
		return array;
	}

	public ArrayList<DatosProductos> darProductosUsuario(String userEmail) {
		System.out.println(System.currentTimeMillis());
		ArrayList<DatosProductos> array= new ArrayList<DatosProductos>();
		Calendar c = Calendar.getInstance();  
		c.add(Calendar.MONTH, -1);
		String menAnterior=c.getTime().toString();
		String[] temp=menAnterior.split(" ");
		menAnterior=temp[2]+"-"+temp[1]+"-"+temp[5];
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs = stmt.executeQuery("SELECT P.ID,P.NOMBRE,P.VALOR_ESTIMADO,O.ID AS OID FROM PRODUCTOS P LEFT JOIN OFERTAS O ON P.ID=O.ID_PRODUCTO_OFERTADO WHERE P.EMAIL_CLIENTE='"+userEmail+"' AND P.FECHA_REGISTRO>=to_date('"+menAnterior+"') order by p.nombre asc");
			while ( rs.next() ) {
				if(rs.getString("OID")!=null && rs.getString("OID").compareToIgnoreCase("null")!=0){
					DatosProductos item = new DatosProductos(rs.getString("ID"), rs.getString("NOMBRE"), rs.getString("VALOR_ESTIMADO"),rs.getString("OID"),"TODO","TODO","TODO");
					completarValoresSecundarios(item, rs.getString("OID"));
					array.add(item);
				}else{
					array.add(new DatosProductos(rs.getString("ID"), rs.getString("NOMBRE"), rs.getString("VALOR_ESTIMADO"),"N.A","N.A","N.A","N.A"));
				}
			}
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println(System.currentTimeMillis());
		return array;
	}
	
	private void completarValoresSecundarios(DatosProductos p, String id){
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs = stmt.executeQuery("SELECT P.NOMBRE,P.VALOR_ESTIMADO,C.EMAIL FROM DEMANDADO_OFERTAS D  JOIN OFERTAS O ON D.ID_OFERTA=O.ID  JOIN PRODUCTOS P ON D.ID_PRODUCTO=P.ID  JOIN CLIENTES C ON P.EMAIL_CLIENTE=C.EMAIL WHERE O.ID='"+id+"'");
			while ( rs.next() ) {
				 p.setValorDemandado(rs.getString("VALOR_ESTIMADO"));
				 p.setNombreDemandado(rs.getString("NOMBRE"));
				 p.setDemandante(rs.getString("EMAIL"));
			}
			rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String invalidarOfertasSegunCliente(String emailDemandante) {
		System.out.println(System.currentTimeMillis());
		String resp="";
		Calendar c = Calendar.getInstance();  
		c.add(Calendar.MONTH, -1);
		String menAnterior=c.getTime().toString();
		String[] temp=menAnterior.split(" ");
		menAnterior=temp[2]+"-"+temp[1]+"-"+temp[5];
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs =stmt.executeQuery("SELECT O.ID FROM OFERTAS O JOIN DEMANDADO_OFERTAS D ON D.ID_OFERTA=O.ID JOIN PRODUCTOS P ON P.ID=D.ID_PRODUCTO JOIN CLIENTES C ON P.EMAIL_CLIENTE=C.EMAIL WHERE C.EMAIL='"+emailDemandante+"' and OFERTAS.FECHA>=to_date('"+menAnterior+"')'");
			while ( rs.next() ) {
				stmt.executeQuery("UPDATE OFERTAS O SET O.ESTADO='4' WHERE O.ID='"+rs.getString("ID")+"'");
			}
			resp="Ofertas del cliente "+emailDemandante+" canceladas exitosamente";
		} catch (SQLException e) {
			e.printStackTrace();
			resp="error al realizar la peticion";
		}
		System.out.println(System.currentTimeMillis());
		return resp;
	}

	public String actualizarOferta(String idDemandado, boolean b) {
		System.out.println(System.currentTimeMillis());
		String query = "",resp="";
		if (b) {
			query="UPDATE OFERTAS O SET O.ESTADO='2' WHERE O.ID='"+idDemandado+"'";
			
		}else{
			query="UPDATE OFERTAS O SET O.ESTADO='3' WHERE O.ID='"+idDemandado+"'";
		}
		try {
			Statement stmt = conexion.createStatement();
			stmt.executeQuery(query);
			if (b) {
				resp="Ofertas aceptada exitosamente";
			} else {
				resp="Ofertas rechazada exitosamente";
			}
		} catch (Exception e) {
			e.printStackTrace();
			resp="error al realizar la peticion";
		}
		System.out.println(System.currentTimeMillis());
		return resp;
	}

	public String actualizarPrecio(String id, int nPrecio) {
		System.out.println(System.currentTimeMillis());
		String resp="";
		try {
			Statement stmt = conexion.createStatement();
			stmt.executeQuery("UPDATE PRODUCTOS P SET P.VALOR_ESTIMADO='"+nPrecio+"' WHERE P.ID='"+id+"'");
			resp="Se cambio el precio del producto!";
		} catch (Exception e) {
			e.printStackTrace();
			resp="No se cambio el precio del producto!";
		}
		System.out.println(System.currentTimeMillis());
		return resp;
	}

	public String generarContraOferta(String idTemp, String idProducto,
			String idDemandadoTemp) {
		System.out.println(System.currentTimeMillis());
		String resp="";
		String now = Calendar.getInstance().getTime().toString();
		try {
			Statement stmt = conexion.createStatement();
			stmt.executeQuery("INSERT INTO OFERTAS VALUES(seq_ofertas.nextval,to_date('"+now+"')'),'1','"+idProducto+"','"+idDemandadoTemp+"'");
			stmt.executeQuery("INSERT INTO DEMANDADO_OFERTAS VALUES(seq_ofertas.currval,'"+idTemp+"'");
			resp="Contra Oferta registrada!";
		} catch (Exception e) {
			e.printStackTrace();
			resp="Error al registrar la contraoferta!";
		}
		System.out.println(System.currentTimeMillis());
		return resp;
	}

	public String req25(String value) {
		String resp= "";
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs =stmt.executeQuery("SELECT COUNT(C.EMAIL) AS RESPUESTA FROM CLIENTES C WHERE C.ESTATUS='"+value+"'");
			while ( rs.next() ) {
				resp=rs.getString("RESPUESTA");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			resp="error al realizar la peticion";
		}
		return resp;
	}

	public ArrayList<String> req24(String value) {
		ArrayList<String> resp= new ArrayList<String>();
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs =stmt.executeQuery("SELECT C.EMAIL,C.PAIS FROM CLIENTES C WHERE C.ESTATUS='"+value+"'");
			while ( rs.next() ) {
				resp.add(rs.getString("EMAIL")+"/"+rs.getString("PAIS"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
			resp.add("error al realizar la peticion");
		}
		return resp;
	}

	public String req26() {
		String resp= "";
		try {
			Statement stmt = conexion.createStatement();
			ResultSet rs;
			rs =stmt.executeQuery("SELECT COUNT(C.EMAIL) AS RESPUESTA FROM CLIENTES C");
			while ( rs.next() ) {
				resp=rs.getString("RESPUESTA");
			}
		} catch (SQLException e) {
			e.printStackTrace();
			resp="error al realizar la peticion";
		}
		return resp;
	}

	
}
